//
//  Problem383.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/22.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 383. 赎金信
 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串，判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成，返回 true ；否则返回 false。

 (题目说明：为了不暴露赎金信字迹，要从杂志上搜索各个需要的字母，组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

 示例 1：
     输入：ransomNote = "a", magazine = "b"
     输出：false
 示例 2：
     输入：ransomNote = "aa", magazine = "ab"
     输出：false
 示例 3：
     输入：ransomNote = "aa", magazine = "aab"
     输出：true

 提示：
 你可以假设两个字符串均只含有小写字母。

 */
@objcMembers class Problem383: NSObject {
    func solution() {
        print(canConstruct("a", "b"))
        print(canConstruct("aa", "ab"))
        print(canConstruct("aa", "aab"))
    }
    /*
     1: 创建一个字典dic存储magazine字符的个数
     2: 遍历ransomNote的字符c
        2.1 c不在dic中，那么返回false
        2.2 c在dic中，dic[c] -= 1
        2.3 dic[c] <= 0 返回false
     */
    func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool {
        if ransomNote.count == 0 {
            return true
        } else if magazine.count == 0 {
            return false
        }
        
        var dic:[Character: Int] = [:]
        
        for c in magazine {
            dic[c, default: 0] += 1
//            if dic[c] == nil {
//                dic[c] = 1
//            } else {
//                dic[c]! += 1
//            }
        }
        
        for c in ransomNote {
            if dic[c] == nil {
                return false
            } else {
                if dic[c]! <= 0 {
                    return false
                }
                
                dic[c]! -= 1
            }
        }
        
        return true
    }
}
